package com.bestcem.xm.member.service;

import com.alibaba.fastjson.JSONObject;
import com.bestcem.xm.common.core.constant.RegTypes;
import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.common.core.domain.web.XmResultJson;
import com.bestcem.xm.member.controller.param.HttpCreateMemberParam;
import com.bestcem.xm.member.controller.param.HttpCreateMemberParams;
import com.bestcem.xm.member.controller.param.HttpDeleteMembersParam;
import com.bestcem.xm.member.controller.param.HttpUpdateHttpMemberParam;
import com.bestcem.xm.member.controller.v2.param.CountGroupMemberParam;
import com.bestcem.xm.member.controller.v2.param.FilterMembersParam;
import com.bestcem.xm.member.controller.v2.param.HttpDeleteGroupMemberParam;
import com.bestcem.xm.member.entity.pojo.MemberDO;
import com.bestcem.xm.member.enums.MemberTypeEnum;
import com.bestcem.xm.member.grpc.service.param.PageParam;
import com.bestcem.xm.member.grpc.service.param.extendfield.BatchUpdateFieldsParam;
import com.bestcem.xm.member.grpc.service.param.member.*;
import com.bestcem.xm.member.service.dto.*;

import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.List;

/**
 * 联系人
 *
 * @author yf.wang <yf.wang@idiaoyan.com>
 * @version V1.0
 * @date 2021/7/16
 */
public interface MemberService {
    /**
     * 检查用户是否可见当前联系人的联系方式
     * @param param 请求参数
     * @return true 用户可见
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/8/17
     */
    ServiceResult<Boolean> checkUserDisplayRangePerm(CheckDisplayRangePermParam param);

    /**
     * 检查用户是否可见当前联系人类型的联系方式
     * @param param 请求参数
     * @return true 用户可见
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/13
     */
    ServiceResult<Boolean> checkUserDisplayRangePermByMemberType(CheckDisplayRangePermByMemberTypeParam param);

    /**
     * 创建联系人
     *
     * @param param
     * @return
     */
    ServiceResult<String> createMember(HttpCreateMemberParam param);

    /**
     * 批量删除联系人(Http)
     *
     * @param param
     * @return
     */
    ServiceResult<Integer> deleteMembers(HttpDeleteMembersParam param);

    /**
     * 条件删除联系人
     * @param param 参数
     * @return 删除数量
     */
    ServiceResult<Integer> deleteGroupMembers(HttpDeleteGroupMemberParam param);

    /**
     * 批量删除联系人 (gRPC)
     *
     * @param param
     * @return
     */
    ServiceResult<Integer> deleteMembers(DeleteMembersParam param);

    /**
     * 批量修改联系人扩展字段
     * @param param 批量更新参数
     * @return
     */
    ServiceResult<Boolean> batchUpdateExtendField(BatchUpdateFieldsParam param);

    /**
     * 获取联系人信息
     *
     * @param id
     * @param orgId
     * @param userId
     * @return
     */
    ServiceResult<MemberDTO> getMemberDetail(String id, String orgId, String userId, Integer superAdmin, Integer seniorAdmin);

    /**
     * 获取联系人信息
     *
     * @param param
     * @return
     */
    ServiceResult<MemberDTO> getMemberDetail(GetMemberParam param);

    /**
     * 查询联系人列表，作为基础查询方法，不修改参数
     * @param param 查询参数
     * @return 联系人分页集合
     */
    ServiceResult<PageDTO<MemberDO>> baseFilterMembers(FilterMembersParam param);

    /**
     * 条件过滤投放联系人
     * @param param 请求参数
     * @return 联系人信息
     */
    ServiceResult<PageDTO<MemberDTO>> listFilterDeliveryMembers(ListFilterMemberParam param);

    /**
     * 查询企业个人联系人数量
     * @param orgId 企业标识
     * @return 个人联系人
     */
    ServiceResult<Long> countIndividualMember(String orgId);

    /**
     * 更新联系人(Http)
     *
     * @param param
     * @return
     */
    XmResultJson<String> updateMember(HttpUpdateHttpMemberParam param);

    /**
     * 更新联系人(gRPC)
     *
     * @param param
     * @return
     */
    ServiceResult<String> updateMember(UpdateMemberParam param);

    /**
     * 校验邮箱是否唯一
     *
     * @param orgId
     * @param mType
     * @param email
     * @return
     */
    XmResultJson<JSONObject> validateEmail(String orgId, Integer mType, String email);

    /**
     * 校验手机号是否唯一
     *
     * @param orgId
     * @param mType
     * @param mobile
     * @return
     */
    XmResultJson<JSONObject> validateMobile(String orgId, Integer mType, String mobile);

    /**
     * 获取计算字段
     *
     * @return
     */
    XmResultJson<List<MetaFieldDTO>> listComputeFields();

    /**
     * 获取基础字段
     *
     * @param mtype
     * @param orgId
     * @return
     */
    XmResultJson<ListMetaFieldsDTO> listMetaFields(Integer mtype, String orgId);

    /**
     * 按联系人名称分页模糊查询联系人
     * @param orgId 企业标识
     * @param userId 用户标识
     * @param memberTypeEnum 联系人类型枚举 当联系人类型不存在时，不区分类型
     * @param nameRegex 联系人名称模糊查询参数 不存在时不按名称匹配
     * @param pageParam 联系人分页参数
     * @return 联系人分页结果
     */
    ServiceResult<PageDTO<MemberDTO>> listByNameRegex(@Pattern(regexp = RegTypes.OBJECT_ID, message = "组织id格式错误") String orgId,
                                                      @Pattern(regexp = RegTypes.OBJECT_ID, message = "用户id格式错误") String userId,
                                                      @Nullable MemberTypeEnum memberTypeEnum,
                                                      @Nullable String nameRegex,
                                                      @NotNull PageParam pageParam,
                                                      @NotNull Integer superRole,
                                                      @NotNull Integer isSenior);

    /**
     * 模糊查询联系人
     * @param param 请求参数
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/8/2
     */
    ServiceResult<PageDTO<MemberDTO>> listMembers(ListContactMembersParam param);

    /**
     * 创建member
     *
     * @param member
     * @param quota
     */
    ServiceResult<Void> createImportMember(MemberDO member, Integer quota);

    /**
     * 修改member(excel导入)
     *
     * @param member
     * @return
     */
    ServiceResult<Void> updateImportMember(MemberDO member);

    /**
     * 筛选联系人
     *
     * @param param
     * @return
     */
    XmResultJson<PageDTO> filterMembers(FilterMembersParam param);

    /**
     * 根据导入主键查询联系人
     *
     * @param orgId
     * @param attribute
     * @param field
     * @param value
     * @return
     */
    MemberDO queryMember(String orgId, Integer attribute, String field, String value);

    /**
     * 根据微信appid、openid查询联系人
     *
     * @param orgId
     * @param attribute
     * @param appId
     * @param openId
     * @return
     */
    MemberDO findWechatMember(String orgId, Integer attribute, String appId, String openId);

    /**
     * 根据条件获取数据
     *
     * @param orgId
     * @param instituteName
     * @param softDelete
     * @return
     */
    List<MemberDO> findByOrgIdAndInstituteNameAndStatusNot(String orgId, String instituteName, Integer softDelete);

    /**
     * 查询该组织下 指定name 的联系人
     *
     * @param name
     * @param mType
     * @param status
     * @return
     */
    MemberDO findOneByNameAndMtypeAndStatusNe(String name, int mType, int status);

    /**
     * 导入投放联系人
     * @return 联系人id集合
     * @author dc.wang@idiaoyan.com
     */
    ServiceResult<List<String>> importDeliverMember(ImportDeliverMemberParam param);

    /**
     * 根据id获取联系人信息
     *
     * @param param
     * @return
     */
    ServiceResult<MemberDTO> getMemberById(GetMemberByIdParam param);

    /**
     * 根据id列表获取联系人列表
     *
     * @param param
     * @return
     */
    ServiceResult<List<MemberDTO>> listMembersByIds(ListMemberByIdsParam param);

    /**
     * 根据id列表获取联系人列表
     *
     * @param param 请求参数
     * @return 联系人集合
     */
    ServiceResult<List<MemberDTO>> listDeliveryMembersByIds(ListDeliveryMembersByIdsParam param);

    /**
     * 根据 param 获取联系人数据
     *
     * @param paramParam
     * @return
     */
    ServiceResult<List<MemberDTO>> listMembersByParam(ListMembersByParamParam paramParam);

    /**
     * 获取联系人序号
     *
     * @param orgId
     * @param attribute
     * @return
     */
    String getMemberNo(String orgId, Integer attribute);

    /**
     * 批量创建联系人
     *
     * @param params
     * @param index
     * @param orgId
     * @param userId
     * @return
     */
    ServiceResult<CreateMembersDTO> createMembers(List<HttpCreateMemberParams> params, int index, String orgId, String userId);

    /**
     * 获取该组织下 指定联系人的数量
     *
     * @param param
     * @return
     */
    ServiceResult<Long> countOrgMember(CountOrgMemberParam param);

    /**
     * 筛选联系人
     *
     * @param param
     * @return
     */
    ServiceResult<Integer> countGroupMember(CountGroupMemberParam param);

    /**
     * 获取机构名称
     *
     * @param orgId
     * @param memberType
     * @param instituteName
     * @param status
     * @return
     */
    List<MemberDO> findByOrgIdAndMemberTypeAndInstituteNameAndStatusNot(String orgId, int memberType, String instituteName, int status);

    /**
     * 校验用户组织权限
     * @param param 请求参数
     * @return true 有权限
     */
    ServiceResult<Boolean> checkUserStorePermission(CheckUserStorePermParam param);

    ServiceResult<List<MemberDTO>> listMembersByWx(ListMembersByWxParam param);

    /**
     * 为联系人id生成签名
     *
     * @param memberId 联系人id
     * @return 签名
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 11:28 2022/7/18
     */
    //ServiceResult<String> genSig(String memberId);
}
